# Python集合
#   列表 list  元组 tuple  集合set  字典 dict

# 列表
# 列表定义为 []
'''
列表特点：
    1.可以存储不同类型数据
    2.可以存储相同数值
    3.列表中的数据是有序的
    4.列表中可以嵌套列表
    5.列表中的数据可以修改
'''

list = [1, 1, 1.1, False, True, "str", None]
print(list, type(list))

print(list[1])
# 修改
# 通过索引可以修改值
list[5] = "value2"
print(list)
print(list[-2])

# 切片
# [开始位置:结束位置(:步长)]
print(list[1:4])
print(list[1:4:2])

# 反转
# 方式一：
print(list[::-1])
# 方式二：
# 反转并替换原先的列表数据
list.reverse()
print(list)

# 删除
# remove可以指定一个value值进行删除
list.remove(None)
print(list)

# 方式二 del
del list[3]
print(list)

# 方式三 pop 取出值并在原列表中删除值

print(list.pop())
print(list)

print(list.pop(0))
print(list)

# 增加
list.append("value3")
print(list)

# 排序
# 如果列表中的数据需要排序，那么类型需要一致
# list.sort()
list2 = ["1", "2", '1', "4", '3']
list2.sort()

# 倒序
list2.sort(reverse=True)
print(list2)

# 合并
list3 = [1, 2, 1]
# 方式一：
print(list2 + list3)
list2 += list3
print(list2)

# 方式二：
list2.extend(list3)
print(list2)

list2.append(list3)
print(list2)

# 统计
print("*" * 30)
list2.append(True)
print(list2)
# 对应数值类型的1 在很多时候Python会将它看做True
print(list2.count(True))

# 清除
list2.clear()
print(list2)

# 元组 tuple
# 定义元组 ()

'''
特点：
    1.能够存储不同类型的数据
    2.能够存储相同值的数据
    3.不支持修改

'''

tuple1 = (1, 1, 0, True, "str")
print(tuple1, type(tuple1))

print(tuple1[0])
# 不支持修改
# tuple1[0] = "2"
print(tuple1)

# 统计
print(tuple1.count(True))

print(tuple1.index(0, 0))

# 集合 set
'''
特点：
    1.set能够存储不同类型数据
    2.set不能存储相同值的数据(其中 True 和 False 和 1/0 默认是相同的)
    3.set集合中的数据并不是有序的
'''

set1 = {1, 1, 1.1, 'str', True, 0, False}
print(set1, type(set1))

# 集合并不支持下标取数据
# print(set1[1])
# 取值方式
for s in set1:
    print("集合value:", s)

# 删除
# 方式一：
print(set1.pop())
print(set1)
# print(set1.pop())

# 方式二：
# set1.remove('str')
# print(set1)

# 方式三：
set1.clear()
print(set1)

# 增加数据

set1.add("add value")
print(set1)

set2 = {1, 2, 3}
# print(set1 + set2)

set3 = set1.union(set2)
print(set3)

# 集合运算

set4 = {2, 3, 4}
set5 = {3, 4, 5}

print(set4 & set5)  # & 取两个集合中共有元素
print(set4 | set5)  # | 对两个集合中的元素去重合并 和 union 方法结果一致
print(set4 - set5)  # - 对集合减去两个集合共有部分数据

# 字典
# 定义 {K:V} dict
'''
特点：
    1.字典中的Key可以是多种数据类型
    2.字典中相同Key会覆盖，后出现的覆盖先出现
    3.字典中认为 1和True一样 0和False一样
    4.字典中的Key为不可变值，可以用tuple作为Key而list不可以
    5.字典中可以嵌套字典
'''

dict1 = {
    "K1": "V1",
    "K1": "V2",
    1: 1,
    0: 0,
    True: "True",
    False: "False",
    (1, 2): "tuple(1,2)",
    # [1,2]: "list[1,2]"
    "dict": {
        "K1": "Value1",
        "dict2": {
            "K1": "Value2"
        }
    },
    'list': [1, 2, "3"]
}

print(dict1, type(dict1))

dict2 = {
    True: "True",
    False: "False"
}
print(dict2, type(dict2))

# 取元素
# 方式一：通过[Key]取值
print(dict1['K1'])

# 通过get获取数据
print(dict1.get("K1"))

# 嵌套取出字典中的值
print(dict1.get('dict').get('dict2').get('K1'))

# 取出list中的值
print(dict1.get('list')[2], type(dict1.get('list')))

# 修改值
dict1['K1'] = "reset value v2"
print(dict1['K1'])


# 增加值
dict1['K2'] = "add value v2"
print(dict1['K2'])

dict1.setdefault("K2","setdefault value")
print(dict1['K2'])

# 如果给定的Key不存在，那么会用给定的默认value填充，如果存在，不做任何操作
dict1.setdefault("K3","setdefault value")
print(dict1['K3'])


# 删除元素
# 方式一：
print(dict1.pop("K3"))
print(dict1)

# 如果字典中不存在对应Key ,那么直接返回设置的默认值
print(dict1.pop("K4","K4 value"))

# 方式二：
del dict1['K2']
print(dict1)


# 方式三：
# dict1.clear()

